using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._TopographicProductionTools._Cartography._CartographicRefinement
{
    /// <summary>
    /// <para>Thin Spot Heights</para>
    /// <para>Generalizes spot heights for a given area of interest in accordance with product specifications.</para>
    /// <para>根据产品规格概括给定感兴趣区域的光斑高度。</para>
    /// </summary>    
    [DisplayName("Thin Spot Heights")]
    public class ThinSpotHeights : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ThinSpotHeights()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>A point feature layer or feature class representing the spot heights for a given area of interest.</para>
        /// <para>表示给定感兴趣区域的点高度的点要素图层或要素类。</para>
        /// </param>
        /// <param name="_area_of_interest">
        /// <para>Area of Interest</para>
        /// <para>The selected feature in the area of interest (AOI) that is used to identify input features to process. There should be one and only one selected AOI.</para>
        /// <para>感兴趣区域 （AOI） 中的选定特征，用于标识要处理的输入要素。应该有一个且只有一个选定的 AOI。</para>
        /// </param>
        /// <param name="_elevation_field">
        /// <para>Elevation Field</para>
        /// <para>The elevation field in Input Features to use for the spot height.</para>
        /// <para>输入要素中用于点高度的高程字段。</para>
        /// </param>
        /// <param name="_invisibility_field">
        /// <para>Invisibility Field</para>
        /// <para>The field where the visibility attribute will be written.</para>
        /// <para>将写入可见性属性的字段。</para>
        /// </param>
        public ThinSpotHeights(object _in_features, object _area_of_interest, object _elevation_field, object _invisibility_field)
        {
            this._in_features = _in_features;
            this._area_of_interest = _area_of_interest;
            this._elevation_field = _elevation_field;
            this._invisibility_field = _invisibility_field;
        }
        public override string ToolboxName => "Topographic Production Tools";

        public override string ToolName => "Thin Spot Heights";

        public override string CallName => "topographic.ThinSpotHeights";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_features, _area_of_interest, _elevation_field, _invisibility_field, _high_low_spots, _search_distance, _max_spots, _input_contours, _contour_code_field, _depression_code_value, _updated_features];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>A point feature layer or feature class representing the spot heights for a given area of interest.</para>
        /// <para>表示给定感兴趣区域的点高度的点要素图层或要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Area of Interest</para>
        /// <para>The selected feature in the area of interest (AOI) that is used to identify input features to process. There should be one and only one selected AOI.</para>
        /// <para>感兴趣区域 （AOI） 中的选定特征，用于标识要处理的输入要素。应该有一个且只有一个选定的 AOI。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Area of Interest")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _area_of_interest { get; set; }


        /// <summary>
        /// <para>Elevation Field</para>
        /// <para>The elevation field in Input Features to use for the spot height.</para>
        /// <para>输入要素中用于点高度的高程字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Elevation Field")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _elevation_field { get; set; }


        /// <summary>
        /// <para>Invisibility Field</para>
        /// <para>The field where the visibility attribute will be written.</para>
        /// <para>将写入可见性属性的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Invisibility Field")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _invisibility_field { get; set; }


        /// <summary>
        /// <para>High Low Spots Field</para>
        /// <para>The field that will be used to identify the highest and lowest spots.</para>
        /// <para>将用于识别最高点和最低点的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("High Low Spots Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _high_low_spots { get; set; } = null;


        /// <summary>
        /// <para>Search Distance</para>
        /// <para>The minimum distance between spot heights. For example, if the search distance is 3,000 meters, there will be at least 3,000 meters between a chosen spot height and the next chosen spot height. The default value will be 1,300 meters, as this is the optimal value for 50K sheets.</para>
        /// <para>光斑高度之间的最小距离。例如，如果搜索距离为 3,000 米，则所选点高度与下一个选定点高度之间至少有 3,000 米。默认值为 1,300 米，因为这是 50K 图纸的最佳值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Search Distance")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string _search_distance { get; set; } = "1300 Meters";


        /// <summary>
        /// <para>Maximum Number  Of Spots</para>
        /// <para>The number of spot heights will not exceed this number.</para>
        /// <para>光斑高度的数量不会超过这个数字。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Maximum Number  Of Spots")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long? _max_spots { get; set; } = null;


        /// <summary>
        /// <para>Input Contours</para>
        /// <para>Input contours used to identify if point features are in depressions or tops.</para>
        /// <para>用于识别点要素是位于凹陷还是顶部的输入等值线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Contours")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _input_contours { get; set; } = null;


        /// <summary>
        /// <para>Contour Code Field</para>
        /// <para>The field in the database that contains the domain value for index contour, intermediate contour, depression contour, and depression intermediate contour. It is a string value of the field, such as HQC.</para>
        /// <para>数据库中包含索引等值线、中间等值线、凹陷等值线和凹陷中间等值线的域值的字段。它是字段的字符串值，例如 HQC。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Contour Code Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _contour_code_field { get; set; } = null;


        /// <summary>
        /// <para>Depression Code  Value</para>
        /// <para>Used to identify depression code values. A depression refers to an elevation completely surrounded by higher-elevation contour lines.</para>
        /// <para>用于识别抑郁代码值。凹陷是指完全被高程等高线包围的高程。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Depression Code  Value")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _depression_code_value { get; set; } = null;


        /// <summary>
        /// <para>Updated Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Updated Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _updated_features { get; set; }


        public ThinSpotHeights SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}